package com.heima.leetcode.practice;

/**
 * @description: leetcode 137. 只出现一次的数字 II
 * @author 勾新杰
 * @version 1.0
 * @date 2025/1/15 22:01
 */
public class E137 {

    /**
     * <h3>方法一：逐位相加，看是不是3的倍数</h3>
     * @param nums nums数组
     * @return 只出现一次的数字
     */
    public int singleNumber1(int[] nums) {
        int result = 0;
        // 32位，逐位确定是1还是0
        for (int i = 0; i < 32; i++){
            int sum = 0;
            for (int num : nums)
                sum += (num >> i) & 1;
            // 所有数该位之和不是3的倍数，则该位为1，否则为0
            if (sum % 3 != 0)
                result |= (1 << i);
        }
        return result;
    }

    /**
     * <h3>方法二：位运算</h3>
     * @param nums nums数组
     * @return 只出现一次的数字
     */
    public int singleNumber2(int[] nums) {
       int one = 0, two = 0;
       for (int num : nums) {
           one ^= num & ~two;
           two ^= num & ~one;
       }
       return one;
    }
}
